const Investor = require('./Investor');
const Order = require('../core/Order');

/**
 * 机构投资者类（庄家）
 * 特点：大额资金，可能影响市场价格，持有市场全部份额并提供流动性
 */
class InstitutionalInvestor extends Investor {
  /**
   * 创建机构投资者实例
   * @param {Object} config - 投资者配置
   */
  constructor(config = {}) {
    super({
      capital: config.capital || 10000000, // 大额资本
      rationality: config.rationality !== undefined ? config.rationality : 0.95, // 高理性程度
      riskTolerance: config.riskTolerance || 0.7, // 中等偏高风险容忍度
      strategy: config.strategy || null,
      ...config
    });
    
    this.marketImpact = config.marketImpact || 0.1; // 市场影响力
    this.totalShares = config.totalShares || 1000000; // 总份额
    this.minMarketValueThreshold = config.minMarketValueThreshold || 0.1; // 最低市值阈值 (10%)
  }

  /**
   * 获取总资产价值占市场总价值的比例
   * @param {Map} marketPrices - 市场价格映射 assetId -> price
   * @returns {number} 市值比例
   */
  getMarketValueRatio(marketPrices) {
    const totalValue = this.getTotalValue(marketPrices);
    let marketTotalValue = 0;
    
    // 计算市场总价值
    for (const [_, investor] of this.market.investors) {
      marketTotalValue += investor.getTotalValue(marketPrices);
    }
    
    return marketTotalValue > 0 ? totalValue / marketTotalValue : 0;
  }

  /**
   * 检查是否面临破产风险
   * @param {Map} marketPrices - 市场价格映射 assetId -> price
   * @returns {boolean} 是否面临破产风险
   */
  isAtRiskOfBankruptcy(marketPrices) {
    return this.getMarketValueRatio(marketPrices) < this.minMarketValueThreshold;
  }

  /**
   * 提供市场流动性
   * @param {MarketEnvironment} market - 市场环境
   */
  provideLiquidity(market) {
    // 检查市场流动性是否过低
    for (const [assetId, orderBook] of market.orderBooks) {
      // 如果买卖订单簿都很薄，提供流动性
      if (orderBook.buyOrders.length < 3 || orderBook.sellOrders.length < 3) {
        const asset = market.assets.get(assetId);
        const currentPrice = asset.getPrice();
        
        // 提供买单
        if (orderBook.buyOrders.length < 3) {
          const buyPrice = currentPrice * (0.98 + Math.random() * 0.02); // 当前价格的98%-100%
          const buyQuantity = Math.floor(this.capital * 0.01 / buyPrice); // 使用1%资金购买
          
          if (buyQuantity > 0) {
            const buyOrder = new Order(
              this.id,
              assetId,
              'buy',
              buyPrice,
              buyQuantity,
              { orderType: 'limit' }
            );
            market.submitOrder(buyOrder);
          }
        }
        
        // 提供卖单
        if (orderBook.sellOrders.length < 3) {
          const sellPrice = currentPrice * (1.0 + Math.random() * 0.02); // 当前价格的100%-102%
          const sellQuantity = Math.min(
            Math.floor(this.totalShares * 0.01), // 卖出不超过总份额的1%
            Math.floor(this.capital * 0.01 / sellPrice) // 不超过可用资金的1%
          );
          
          if (sellQuantity > 0) {
            const sellOrder = new Order(
              this.id,
              assetId,
              'sell',
              sellPrice,
              sellQuantity,
              { orderType: 'limit' }
            );
            market.submitOrder(sellOrder);
          }
        }
      }
    }
  }

  /**
   * 决策方法 - 庄家策略
   * @param {MarketEnvironment} market - 市场环境
   * @returns {Order|null} 订单或null
   */
  decide(market) {
    // 保存市场引用
    this.market = market;
    
    // 获取市场价格
    const marketPrices = market.getAllAssetPrices();
    
    // 检查是否面临破产风险
    if (this.isAtRiskOfBankruptcy(marketPrices)) {
      // 面临破产风险时采取保守策略
      console.log(`庄家 ${this.name} 面临破产风险，采取保守策略`);
    }
    
    // 提供市场流动性
    this.provideLiquidity(market);
    
    // 调用父类决策方法
    return super.decide(market);
  }

  /**
   * 更新资本
   * @param {number} amount - 资本变化量
   */
  updateCapital(amount) {
    this.capital += amount;
    
    // 检查是否破产
    if (this.capital <= 0) {
      this.isBankrupt = true;
    }
  }
}

module.exports = InstitutionalInvestor;